package operation;

import Beans.Student;
import User.User;
import Utils.InputDataVerificationUtils;
import Utils.MenuInputUtil;
import Utils.SQLSentencePoll;
import dao.DataOperation;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * 添加学生账户的功能对象
 * -- 先查询新增账户是否已经存在，不存在则添加，存在则返回
 * -- 对从键盘录入的信息进行正则校验
 * -- 并提供公共的输入学生信息方法
 */
public class AppendStudentInfo implements IOperation{

    @Override
    public boolean operate(User user) {
        System.out.println("添加学生信息~");
        List<String> accountInfoList = inputStudentInfo();
        if(accountInfoList != null){
            //检查库中是否已存在指定账户
            Student student = DataOperation.queryOne(Student.class, SQLSentencePoll.SpecifiedAccount_Check, accountInfoList.get(0));
            if (student != null){
                System.out.println("已存在此账号！");
            }else{
                //不存在则添加
                Object[] infoArray = accountInfoList.toArray();
                DataOperation.update(SQLSentencePoll.AccountInfo_Insertion, infoArray);
                System.out.println("添加成功！");
            }
        }
        return true; //返回状态
    }

    /**
     * 录入从键盘输入的学生信息，存入list并返回
     * @return list对象，或null（在信息录入过程中提前返回）
     */
    public List<String> inputStudentInfo(){
        Scanner in = new Scanner(System.in);
        //账号注册信息
        String account;
        String password;
        String name;
        String age;
        String gender;
        boolean isValid; //信息格式检查

        //学号校验
        while(true){
            System.out.println("请输入学号（13位纯数字）：");
            account = in.next();
            isValid = InputDataVerificationUtils.verifyAccount(account);
            if(isValid)
                break;
            if(isExit())
                return null;
        }
        //密码检验
        System.out.println("是否使用默认密码(123456)？ Y|N：");
        char isDefault = MenuInputUtil.readConfirmSelection();
        if('N' == isDefault || 'n'  == isDefault){
            //自设密码
            while(true){
                System.out.println("请输入密码(命名规则：0-9、a-z和A-Z的字符组合，长度6-18位)：");
                password = in.next();
                isValid = InputDataVerificationUtils.verifyPassword(password);
                if(isValid)
                    break;
                if(isExit())
                    return null;
            }
        }else{
            password = "123456";
        }
        //姓名校验
        while(true){
            System.out.println("请输入姓名(命名规则：中英字符，长度2-10)：");
            name = in.next();
            isValid = InputDataVerificationUtils.verifyName(name);
            if(isValid)
                break;
            if(isExit())
                return null;
        }
        //年龄校验
        while(true){
            System.out.println("请输入年龄 (1-99岁，不能以0开头)：");
            age = in.next();
            isValid = InputDataVerificationUtils.verifyAge(age);
            if(isValid)
                break;
            if(isExit())
                return null;
        }
        //性别校验
        while(true){
            System.out.println("请输入性别 (男、女或保密)：");
            gender = in.next();
            isValid = InputDataVerificationUtils.verifyGender(gender);
            if(isValid)
                break;
            if(isExit())
                return null;
        }

        return Arrays.asList(account, password, name, age, gender);
    }


    /**
     * 录入从键盘输入的学生信息，存入list并返回
     * @param student 当前学生对象
     * @return list对象，或null（在信息录入过程中提前返回）
     */
    public List<String> inputStudentInfo(Student student){
        Scanner in = new Scanner(System.in);
        //账号注册信息
        String accountId;
        String password;
        String name;
        String age;
        String gender;
        boolean isValid; //信息格式检查

        String isUpdate;
        //学号校验
        while(true){
            System.out.println("请输入新的学号（13位纯数字）或直接回车则不修改此项：");
            isUpdate = in.nextLine();
            if("".equals(isUpdate)){
                accountId = student.getId();
                break;
            }
            //修改
            isValid = InputDataVerificationUtils.verifyAccount(isUpdate);
            if(isValid) {
                accountId = isUpdate;
                break;
            }
            if(isExit())
                return null;
        }
        //密码检验
        while(true){
            System.out.println("请输入新的密码（命名规则：0-9、a-z和A-Z的字符组合，长度6-18位）或直接回车不修改此项：");
            isUpdate = in.nextLine();
            if("".equals(isUpdate)){
                password = student.getPassword();
                break;
            }
            //修改
            isValid = InputDataVerificationUtils.verifyPassword(isUpdate);
            if(isValid) {
                password = isUpdate;
                break;
            }
            if(isExit())
                return null;
        }
        //姓名校验
        while(true){
            System.out.println("请输入姓名（命名规则：中英字符，长度2-10）或直接回车不修改此项：");
            isUpdate = in.nextLine();
            if("".equals(isUpdate)){
                name = student.getName();
                break;
            }
            //修改
            isValid = InputDataVerificationUtils.verifyName(isUpdate);
            if(isValid) {
                name = isUpdate;
                break;
            }
            if(isExit())
                return null;
        }
        //年龄校验
        while(true){
            System.out.println("请输入年龄（1-99岁，不能以0开头）或直接回车不修改此项：");
            isUpdate = in.nextLine();
            if("".equals(isUpdate)){
                age = student.getAge();
                break;
            }
            //修改
            isValid = InputDataVerificationUtils.verifyAge(isUpdate);
            if(isValid) {
                age = isUpdate;
                break;
            }
            if(isExit())
                return null;
        }
        //性别校验
        while(true){
            System.out.println("请输入性别（男、女或保密）或直接回车不修改此项：");
            isUpdate = in.nextLine();
            if("".equals(isUpdate)){
                gender = student.getGender();
                break;
            }
            //修改
            isValid = InputDataVerificationUtils.verifyGender(isUpdate);
            if(isValid) {
                gender = isUpdate;
                break;
            }
            if(isExit())
                return null;
        }

        return Arrays.asList(accountId, password, name, age, gender);
    }

    //是否退出检测
    private boolean isExit(){
        Scanner in = new Scanner(System.in);
        System.out.println("输入不合法！请重新输入。");
        System.out.println("输入任意字符继续，（如想放弃请输入\"退出\"或\"exit\"）：");
        String isExit = in.next();

        return isExit.equals("退出") || isExit.equalsIgnoreCase("exit");
    }
}
